iT邦幫忙

DAY 5
1

用程式描繪世界 - 閱讀The Nature of Code系列 第 5

[Day5] - Non-Uniform Distribution

  • 分享至 

  • xImage
  •  

上一篇講到uniform distribution,使用一個random function讓每一個事件發生的機率都相同。但實際上在自然環境中,很少出現如此平均的情況,大部份的情況都是non-uniform distribution,書中用達爾文的進化論舉例,在同一個猴子族群中,不是每一隻猴子都能夠有相同的機會繁殖下一代,強壯的猴子通常比瘦弱的猴子有較大的機會。

那要怎麼樣用程式實作出non-uniform distribution? 同樣利用random() function,只要稍微修改一下就可以了,在實作之前要先來了解機率是什麼
,機率簡單的說就是 將“指定的事件可能發生的情況”除以“所有情況”,舉例來說投擲一枚硬幣,得到正面的機率是50%,正面的情況/所有情況(正面+反面)。

在一副撲克牌中,抽到A(aces)的機率是:
A的數目/撲克牌的數目 = 4/52 = 0.077 =~ 8%

抽到磚塊(Diamond)的機率是:
磚塊數目/撲克牌數目 = 13/52 = 0.25 = 25%

也可以計算多個連續事件的機率,將所有單一事件的機率相乘就可以了,比如連續擲三次骰子都得到正面的機率是

(1/2) * (1/2) * (1/2) = 1/8 (or 0.125)

回到要怎麼用程式模擬機率這件事,可以使用Array,將機率較高的事件在Array中重複。

  int[] stuff = new int[5]
  stuff[0] = 1;
  stuff[1] = 1;
  stuff[2] = 2;
  stuff[3] = 3;
  stuff[4] = 3;
  int index = int(random(stuff.length));

我們選到Array中每一個index的機率是相同的,都是20%(1/5),但是因為每一個元素填寫的數值可以重複,因此我們stuff[index]選到的數值就可以造成不同的機率,比如說選到1的機率是5分之2,因為1在array中出現兩次。

或者也可以換成另一種寫法:

float prob = 0.10;
float r = random(1);

if (r < prob) {
   // try again!
}

因為random(1)會產生0~1之間的浮點數結果,因此小於0.10的機率是10%,大於等於0.10則是90%

這種方法也可以用在多個結果的事件:

  float num = random(1);
  if (num < 0.6) {
    println("Outcome A");
  } else if (num < 0.7) {
    println("Outcome B");
  } else {
    println("Outcome C");
  }

0.0~0.6的機率為60%
0.6~0.7的機率為70%
0.7~1.0的機率為30%

用了以上方法就可以來模擬non-uniform distribution囉,再拿出random walker來使用,假如要讓random walker偏向右邊行走,計劃如下:

向上走的機率 20%
向下走的機率 20%
向右走的機率 40%
向左走的機率 20%

  void step() {
    float r = random(1);
    if (r < 0.4) {
      x++;
    } else if (r < 0.6) {
      x--;
    } else if (r < 0.8) {
      y++;
    } else {
      y--;
    }
  }

結果在此~http://natureofcode.com/book/introduction/#canvas2

這一節書上有提供一個練習:
將random walker改造成,有50%的機率往滑鼠的方向移動。

我是這樣做的:

  void step() {
    float choice = random(1);
    if(choice < 0.12){
      x++;
    }else if(choice < 0.24){
      x--;
    }else if(choice < 0.36){
      y++;
    }else if(choice < 0.5){
      y--;
    }else{
      int offsetX = mouseX-x;
      int offsetY = mouseY-y;

      if( offsetX > 0){
        x++;
      }else{
        x--;
      }

      if( offsetY > 0){
        y++;
      }else{
        y--;
      }
    }
  }

下一篇介紹Normal Distribution。


上一篇
[Day4] - 隨機移動與Uniform Distribution
下一篇
[Day6] - 常態分佈(Normal Distribution)
系列文
用程式描繪世界 - 閱讀The Nature of Code9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
knight1762
iT邦新手 5 級 ‧ 2014-10-17 10:31:03

0.6~0.7的機率為10%

我要留言

立即登入留言